home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 011-020 / amok19 / trackdisksupport / trackdisksupport.dok < prev    next >
Text File  |  1993-11-04  |  13KB  |  303 lines

  1. ======================================================================
  2. Dokumentation zu "TrackDiskSupport" Version 2.1
  3. Autoren: Nicolas Benezan, Postwiesenstr. 2, D7000 Stuttgart 60
  4.          Fridtjof Siebert, Nobileweg 67, D7000 Stuttgart 40
  5. Thanx to Frank Staudte for english translation
  6. ======================================================================
  7.  
  8. Kopierrecht
  9. ­­­­­­­­­­­
  10. Das komplette Packet (Quelltext, Dokumentation und Objectcode) ist
  11. Public Domain Software. Es darf beliebig kopiert und verbreitet werden
  12. solange...
  13.  
  14. * unsere Namen und dieser Kopierrechtshinweis erhalten bleiben,
  15. * die Vollständigkeit des ganzen Packets gewährleistet ist, und
  16. * mit dem Vertrieb dieser Software kein Gewinn erwirtschaftet wird.
  17.  
  18. Die Kommerzielle Nutzung ohne unsere ausdrückliche schriftliche Genehmigung
  19. ist untersagt. Ferner ist allen Personen, die in irgend einer Weise etwas
  20. mit "Data Becker" zu tun haben, insbesondere für "Data Becker" arbeiten
  21. oder deren Produkte verkaufen, jegliche Verwendung dieser Software
  22. verboten.
  23.  
  24. Verbesserungsvorschläge sind stets willkommen. Falls Sie Veränderungen
  25. am Programm vornehmen, dokumentieren Sie diese bitte gut verständlich.
  26. Es würde uns freuen, wenn Sie uns über größere Veränderungen in
  27. Kenntnis setzen würden.
  28.  
  29. (c) 1988 by Nicolas Benezan & Fridtjof Siebert.
  30.  
  31.  
  32. Übersicht
  33. ­­­­­­­­­
  34. * Umfang des Packets
  35. * Einleitung
  36. * Beschreibung der Prozeduren
  37.  
  38. Umfang des Packet
  39. ­­­­­­­­­­­­­­­­­
  40. Das komplette Packet "TrackDiskSupport" beinhaltet folgendes:
  41.  
  42. * TrackDiskSupport.dok          Diese Dokumentation
  43. * TrackDiskSupport.doc          Englische Dokumentation
  44. * TrackDiskSupport.def, -.mod   Quelltext
  45. * TrackDiskSupport.sym, -.obj   Objektcode
  46. * TrackDemo.mod, -.obj          Demo/Testmodul
  47. * InhibitDemo.mod, -obj         Demo/Testmodul
  48.  
  49. (Stand 14.Mai.1989)
  50.  
  51.  
  52. Einleitung
  53. ­­­­­­­­­­
  54. Dieses Modul (Version 2.1) entstand im wesentlichen aus dem schon auf
  55. Amok#11 veröffentlichten "TrackdiskSupport". Es unterstützt wie die alte
  56. Version hauptsächlich die Programmierung des "trackdisk.device", d.h.
  57. das Lesen und Schreiben einzelner Diskettenblöcke sowie einige
  58. Zusatzfunktionen wie z.B. Motorkontrolle und Abfragen des Status. Neu
  59. hinzugekommen ist die Möglichkeit, auch andere blockorientierte Geräte wie
  60. Festplatten oder bestimmte Ramdisks anzusprechen. Neu ist außerdem eine
  61. Prozedur, mit der man die Dos-Zugriffe auf ein bestimmtes Laufwerk sperren
  62. kann (während eines Kopiervorgangs), sodaß die Workbench "DFx:BUSY"
  63. anzeigt.
  64.  
  65.  
  66. Beschreibung der Prozeduren
  67. ­­­­­­­­­­­­­­­­­­­­­­­­­­­
  68.  
  69. OpenDiskDevice()
  70. ----------------
  71. Bevor mit einem Laufwerk gearbeitet werden kann, muß es zuerst mit
  72. "OpenDiskDevice" geöffnet werden. Man übergibt den Namen des gewünschten
  73. Geräts (z.B. "DF0", "DH1" oder "JH0"), wobei der Doppelpunkt weggelassen
  74. wird. Unzulässig sind Diskettennamen (z.B. "Workbench") oder logische
  75. Geräte, die mit "Assign" zugewiesen wurden (z.B. "SYS", "Libs"). Ebenfalls
  76. unzulässig sind Geräte, die nicht blockorientiert sind (z.B. "CON", "RAW"
  77. oder "PRT"). Beachten Sie bitte, daß manche Ramdisks blockorientiert sind
  78. ("CARD"), andere wiederum nicht ("RAM", "VD0").
  79. Die Prozedur gibt einen opaken Datentyp "DiskUnit" zurück, der für die
  80. weiteren Operationen gebraucht wird, sowie eine Fehlernummer (0 = kein
  81. Fehler). Die Fehlernummern und ihre Bedeutung stehen im Modul "TrackDisk",
  82. das sich im Standardumfang des Compilers befindet, und reichen von
  83. "notSpecified=20" bis "postReset=35". Besonders zu erwähnen wäre der Fehler
  84. "badDriveType=33", der unter anderem besagt, das das gewünschte Gerät nicht
  85. angeschlossen ist, oder das es sich um ein nicht blockorientiertes handelt.
  86. Bitte beachten Sie, daß weitere operationen (auch das Schließen) nur
  87. zulässig sind, wenn das Öffnen erfolgreich war (Fehlernummer 0).
  88.  
  89. CloseDiskDevice()
  90. -----------------
  91. Sind alle Arbeiten mit einem Laufwerk abgeschlossen, sollte dieses mit
  92. "CloseDiskDevice" geschlossen werden.
  93. Falls ein Laufwerk durch einen Fehler im Programm oder einen Abbruch bei
  94. Programmende geöffnet bleibt, wird dieses von TrackDiskSupport automatisch
  95. geschlossen, sodaß nichts schlimmeres zu befürchten ist. Trotzdem sollte
  96. nicht zu leichtsinnig damit umgegangen werden, da ein Datenverlust nicht
  97. ganz auszuschließen ist.
  98.  
  99.  
  100. Die folgenden Prozeduren sind im wesentlichen identisch mit denen der alten
  101. Version von Amok#11. Sie implementieren meistens direkt die entsprechenden
  102. Kommandos des trackdisk.device.
  103. Es wurde konsequent darauf geachtet, daß der Benutzer nicht auf Byte-
  104. Offsets oder ähnliches achten muß. Alle Prozeduren arbeiten mit logischen
  105. Blocknummern, die bei 3.5"-Disk z.B. von 0 bis 1759 reichen (2 Seiten, 80
  106. Zylinder, 11 Blöcke je Spur). Festplattenpartitionen werden richtig erkannt
  107. und verwaltet. So muß z.B. Block Nr. 0 einer Festplattenpartition nicht
  108. unbedingt wirklich auf der Spur 0, erster Block liegen, sondern ist der
  109. erste Block der Partition, auch wenn die Partition erst bei Spur 100
  110. anfängt.
  111.  
  112. Hier noch eine Begriffsklärung: Ein "Block" entspricht einem "sector", eine
  113. "Spur" einem "track" und eine "Seite" einer "surface", wobei die Anzahl der
  114. "Köpfe" ("heads") eines Laufwerks natürlich gleich der Anzahl "Seiten" ist.
  115. Die Gesammtheit aller übereinanderliegenden "Spuren" bilden einen
  116. sog. "Zylinder" ("cylinder"). Alles klar? Nein? Dann noch ein Beispiel:
  117.  
  118. Eine 3.5"-Diskette hat 2 Seiten (surfaces) und 80 Zylinder (cylinders),
  119. insgesammt also 160 Spuren (tracks). Jede Spur hat 11 Blöcke (sectors),
  120. insgesammt also 1760 Blöcke.
  121.  
  122. GetDeviceInfo()
  123. ---------------
  124. Mit dieser Prozedur können alle wichtigen Parameter eines Laufwerks
  125. ermittelt werden. Es wird ein RECORD mit folgenden Informationen geliefert:
  126.  
  127. devName:        Name des zugehörigen devices (z.B. "trackdisk.device")
  128. devUnit:        Nummer der Laufwerkseinheit (z.B. 2 für DF2:)
  129. devFlags:       wird intern bei Aufruf von Exec.OpenDevice benötigt
  130. blockLen:      *Länge eines Blocks in Byte
  131. trackLen:      *Länge einer Spur in Byte
  132. cylinderLen:    Länge eines Zylinders in Byte
  133. numBlocks:     *Gesammtzahl der Blöcke auf der Disk oder Partition
  134.                 alle logischen Blocknummern müssen im Bereich
  135.                 [0..numBlocks-1] liegen!
  136. offset:         Anfang der Partition
  137. disk:           Zeiger auf weitere Informationen (siehe unten)
  138. handler:        für dieses Gerät zuständiger FileHandler-Prozess
  139.  
  140. Für den Benutzer sind nur die mit einem "*" gekennzeichneten Einträge
  141. interessant. Vorsicht: Fragen sie diese immer ab und setzen sie keine
  142. bestimmten Werte voraus. Bedenken Sie, daß auch 5.25"-Laufwerke mit nur
  143. 40 Zylinder angeschlossen sein können.
  144.  
  145. Für die ganz besonderen Spezialisten (siehe auch Modul "DosSupport"):
  146.  
  147. disk^.length:       Anzahl der gültigen Parameter in dieser Tabelle
  148.                     (normalerweise 11 oder 16 - Vorsicht: falls 11 sind
  149.                      die Einträge ab BufMemType nicht mehr gültig!)
  150. disk^.blockSize:    Langwörter pro Block
  151. disk^.origin:       Nummer des ersten Blocks pro Spur (immer 0)
  152. disk^.surfaces:     Anzahl Seiten bzw. Köpfe
  153. disk^.secBlock:     Anzahl Sektoren pro logischem Block (immer 1)
  154. disk^.numSecs:      Blöcke pro Spur
  155. disk^.resBlocks:    Anzahl reservierter Blöcke (2 Boot-Blöcke)
  156. disk^.prealloc:     Preallocation-Faktor
  157. disk^.interleave:   Interleave-Faktor
  158. disk^.lowCyl:       Erster Zylinder der Partition
  159. disk^.highCyl:      Letzter Zylinder der Partition
  160. disk^.numBuffers:   Anzahl der Cache-Puffer
  161. disk^.BufMemType:   Typ des Pufferspeichers (1=egal, 3=chip, 5=fast)
  162. disk^.reserved1:    ???, meistens 7FFFFFFFH
  163. disk^.reserved2:    ???, meistens -2
  164. disk^.reserved3:    ???, meistens 0
  165. disk^.diskType:     Kennzeichen der Diskette (normalerweise "DOS")
  166.  
  167.  
  168. BlockNumber()
  169. -------------
  170. Mit dieser Prozedur kann man aus der Zylinder-, Seiten- und Sektorzahl die
  171. logische Blocknummer berechnen. Beachten Sie, daß bei Festplatten-
  172. partitionen die Zylinder- und Blocknummern vom Anfang der Partition und
  173. nicht vom tatsächlich hardwaremäßigen Anfang gezählt werden.
  174.  
  175. GetDiskChange()
  176. ---------------
  177. Diese Prozedur entspricht dem "changeNum"-Kommando des trackdisk.device und
  178. liefert die Anzahl der Diskettenwechsel seit dem Systemstart. Dies ist
  179. notwendig, um eventuelle Diskettenwechsel zu bemerken. Unter anderem
  180. benötigen auch die Read/Write-Prozeduren diese Zahl. Somit kann verhindert
  181. werden, daß irrtümlich auf die falsche (inzwischen gewechselte) Diskette
  182. geschrieben wird.
  183.  
  184. ChangeState()
  185. -------------
  186. Diese Prozedur entspricht dem "changeState"-Kommando des trackdisk.device
  187. und gibt an, ob gerade eine Diskette in dem angegebenen Laufwerk eingelegt
  188. ist.
  189.  
  190. ProtStatus()
  191. ------------
  192. Diese Prozedur entspricht dem "protStatus"-Kommando des trackdisk.device
  193. undgibt an, ob die Diskette in dem angegebenen Laufwerk beschrieben werden
  194. darf.
  195.  
  196. Motor()
  197. -------
  198. Diese Prozedur entspricht dem "motor"-Kommando des trackdisk.device und
  199. ermöglicht das An- oder Abschalten des Laufwerksmotors. In der Praxis wird
  200. eigentlich nur das Abschalten benötigt, weil der Motor bei einer
  201. Schreib/Leseoperation automatisch angeschaltet wird. Nach dem letzten
  202. Zugriff, oder wenn bis zum nächsten Zugriff noch viel Zeit vergeht, sollte
  203. man also den Motor abschalten. Bei Festplatten bewirkt das Kommando
  204. natürlich nicht das Abschalten des Motors, sondern das Parken der Köpfe,
  205. sofern die Platte über eine solche Funktion verfügt.
  206.  
  207. Seek()
  208. ------
  209. Diese Prozedur entspricht dem "seek"-Kommando des trackdisk.device und
  210. dient dazu, die Köpfe eines Laufwerks auf eine bestimmte Position zu
  211. fahren. Normalerweise ist dies unnötig, da die Köpfe bei Schreib/Lese-
  212. operationen automatisch bewegt werden. Eine mögliche Anwendung wäre:
  213. bei einem Kopierprogramm schon vor dem einlegen der Diskette die Köpfe auf
  214. die richtige Position zu fahren, um Zeit zu sparen.
  215.  
  216. ReadBlock()
  217. -----------
  218. Diese Prozedur entspricht dem "extRead"-Kommando des trackdisk.device und
  219. dient zum Lesen von einem oder mehreren aufeinanderfolgenden Blöcken. Es
  220. muß eine logische Blocknummer und die Anzahl der zu lesenden Blöcke sowie
  221. die Adresse eines Puffers angegeben werden. Der Puffer muß auf einer
  222. Langwortadresse beginnen und zumindest bei TrackDisk-Geräten im ChipMemory
  223. liegen. Bei anderen Geräten (Festplatten, Ramdrives) im Zweifelsfall den
  224. Eintrag "BufMemType" untersuchen (siehe "GetDeviceInfo"). Ferner muß die
  225. Diskettenwechselnummer übergeben werden (siehe "GetDiskChange"). bei
  226. mehreren zusammengehörigen Zugriffen sollte natürlich jedesmal die gleiche
  227. Wechselnummer angegeben werden, wozu man diese in einer Variable speichert.
  228.  
  229. WriteBlock()
  230. ------------
  231. Diese Prozedur entspricht dem "extWrite"-Kommando des trackdisk.device und
  232. dient zum Schreiben von Blöcken. Die Parameter sind die gleichen wie bei
  233. "ReadBlock".
  234.  
  235. Update()
  236. --------
  237. Diese Prozedur entspricht dem "update"-Kommando des trackdisk.device und
  238. veranlaßt das trackdisk.device, noch im Speicher befindliche Puffer auf
  239. Diskette zu schreiben. Dies hat folgenden Hintergrund: aus Geschwindig-
  240. keitsgründen wird nicht jeder einzelne Block auf Diskette geschrieben,
  241. sondern erst in einen Puffer geschrieben und solange gewartet, bis ein
  242. Track komplett ist. Ist für längere Zeit kein Schreibzugriff mehr geplant,
  243. empfiehlt sich aus Gründen der Datensicherheit, diesen Befehl zu verwenden,
  244. denn der Benutzer könnte ja die Diskette herausnehmen oder der Computer
  245. könnte abstürzen. In einem solchen Fall wären die zuletzt geschriebenen
  246. Daten verloren.
  247.  
  248. FormatTrack()
  249. -------------
  250. Diese Prozedur entspricht dem "extFormat"-Kommando des trackdisk.device und
  251. dient dazu, eine Spur zu formatieren und zu beschreiben. Der Puffer muß
  252. genügend Daten für eine ganze Spur enthalten. Außer zum formatieren von
  253. vorher leeren Disketten wird dieser Befehl auch in Kopierprogrammen
  254. verwendet, da das Formatieren einer ganzen Spur schneller geht als das
  255. beschreiben einzelner Blöcke.
  256.  
  257. Clear()
  258. -------
  259. Diese Prozedur entspricht dem "clear"-Kommando des trackdisk.device und
  260. ist das Gegenteil von "Update". Es verhindert, das eventuell noch im
  261. Speicher befindliche Puffer auf Diskette geschrieben werden (weil diese
  262. eventuell ungültige Daten enthalten könnten). Der praktische Nutzen dieses
  263. Befehls ist gering.
  264.  
  265. GetDriveType() und GetNumTracks()
  266. ---------------------------------
  267. Diese Prozeduren wurden nur aus Kompatiblitätsgründen zur alten Version 1.0
  268. übernommen. Von deren Verwendung wird dringendst abgeraten. Es wird
  269. empfohlen, an deren Stelle die Prozedur "GetDeviceInfo" zu verwenden.
  270. VORSICHT: bei einigen Harddisktreibern sind diese Befehle gar nicht
  271. implementiert und führen zu den "schönsten" Abstürzen (Bildschirmflimmern
  272. und Rattern aller Laufwerke)!
  273.  
  274. InhibitDrive()
  275. --------------
  276. Da z.B. während eines Kopiervorgangs eine diskette nur halb beschrieben ist
  277. und teilweise ungültige Daten enthält, muß der Zugriff des Dos (Filesystem
  278. und Disk-Validator) während dieser Zeit gesperrt werden. Dies kann mit
  279. "InhibitDrive" geschehen. Die Workbench zeigt dann "DFx:BUSY" an und im CLI
  280. wird "No Dos Disk" gemeldet.
  281.  
  282.  
  283. Die Prozeduren zum Installieren von DiskChange-Interrupts entfielen
  284. ersatzlos, da sie wegen eines Fehlers im Betriebssystem sowieso nicht
  285. funktionieren können.
  286.  
  287.  
  288. Demos / Testmodule
  289. ­­­­­­­­­­­­­­­­­­
  290. Zu "TrackDiskSupport" gehören zwei Demos, die die Verwendung der Prozeduren
  291. demonstrieren
  292.  
  293. TrackDemo frägt nach einem Gerätenamen und zeigt dann einige Informationen
  294. zum entsprechenden Laufwerk an.
  295.  
  296. InhibitDemo frägt nach einem Gerätenamen und sperrt das entsprechende
  297. Laufwerk für 4 Sekunden für Dos-Zugriffe (erkennbar am Workbench-Icon).
  298.  
  299.  
  300. ------------
  301. Viel Spaß
  302.  
  303.